package com.gadgets.framework.common.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;

import javax.validation.constraints.NotNull;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Locale;

/**
 * @author UncleXiu
 * @version V1.0.0
 * @data 2020-09-15
 * 
 */
public class I18nMessageUtils {

    private static final Logger logger = LoggerFactory.getLogger(I18nMessageUtils.class);

    public static final String I18N_NULL_MSG = "Can not find i18n Message, Please Check i18n.properties";

    /**
     * i18n 数据容器
     * K(国际化标识) - K(码值) - V(信息模板)
     */
    private static final HashMap<Locale,HashMap<String,String>> I18N_MSG_CONTAINER = new HashMap<>();

    /**
     * 新增I18N信息
     * @param locale    本地化信息
     * @param code      码值
     * @param msg       信息模板
     */
    public static void addI18nMsg(Locale locale, String code, String msg){
        if(!I18N_MSG_CONTAINER.containsKey(locale)){
            I18N_MSG_CONTAINER.put(locale,new HashMap<>());
        }
        if(I18N_MSG_CONTAINER.get(locale).containsKey(code)){
            logger.warn("码值{}重复，新数据将覆盖旧数据",code);
        }
        I18N_MSG_CONTAINER.get(locale).put(code, msg);
    }

    /**
     * 获取指定本地化的I18N信息
     * @param locale    本地化信息
     * @param code      码值
     */
    public static String getI18nMsg(Locale locale, @NotNull String code){
        if(null!=locale && I18N_MSG_CONTAINER.containsKey(locale)){
            return I18N_MSG_CONTAINER.get(locale).get(code);
        }else if(I18N_MSG_CONTAINER.containsKey(Locale.getDefault())){
            return I18N_MSG_CONTAINER.get(Locale.getDefault()).get(code);
        }
        return null;
    }

    /**
     * 获取指定本地化的I18N信息（不支持为空）
     * @param locale    本地化信息
     * @param code      码值
     */
    public static String getI18nMsgNotNull(Locale locale, @NotNull String code){
        String value = getI18nMsg(locale, code);
        return StringUtils.isEmpty(value)?I18N_NULL_MSG:value;
    }

    /**
     * 将指定参数拼接到本地化I18N中
     * @param locale    本地化信息
     * @param code      码值
     * @param args      参数列表
     * @return          信息
     */
    public static String buildI18nMsgInfo(Locale locale, @NotNull String code, Object... args){
        String value = getI18nMsg(locale, code);
        return StringUtils.isEmpty(value)?I18N_NULL_MSG:MessageFormat.format(value,args);
    }

}
